I-폐쇄망 k8s 설치 개요

개요

인터넷과 연결할 수 없는 네트워크 환경을 폐쇄망, 혹은 에어갭이라고 부른다.
이 노트는 쿠버네티스를 에어갭 환경에서 구축하는 방법에 대한 전반적인 개요를 담는다.

클러스터를 구축하는데 있어서 중요한 것은 노드를 어떻게 부트스트랩하고 조인시키는가의 문제이다.
여기에서 폐쇄망 환경이라는 특별 조건이 추가되면 어떻게 필요한 데이터들을 내부망으로 전달하는가의 문제가 추가된다.
후자의 문제는 비단 구축할 때만 고려할 사항이 아니라 앞으로 클러스터를 운영하면서 끊임없이 고려해야 할 문제가 되므로 이에 대한 적절한 전략과 솔루션을 마련할 필요가 있다.
해당 문제는 아래에서 더 구체화시키고, 먼저 클러스터를 구축하는데 필요한 것들이 무엇이 있는지 파악해본다.

클러스터 부트스트랩

먼저 어느 환경에서든 클러스터를 구축하는 기본적인 과정을 정리해본다.

노드 세팅

머신이 노드로서 기능하기 위해 필요한 사항은 다음과 같다.

네트워크 모듈 with cillium

br_netfilter는 기본 컨테이너 네트워킹에서도 필요한 사항이나, cillium으로 kube-proxy까지 대체하는 환경에서 conntrack 모듈이 필요한지는 조금 더 연구 필요

부트스트랩

쿠버네티스 클러스터를 구축하는 기본적인 툴인 kubeadm을 통해 클러스터가 구동되기 위해 필요한 과정을 살펴볼 수 있다.[7]
kubeadm이 실제로 수행하는 절차 중 커스텀이 가능하다 생각되는 것들은 기울임했다.

클러스터 구축에 필요한 패키지, 이미지

다음으로 실제로 클러스터가 돌아가기 위해 필요한 구성품을 알아본다.

들어가기에 앞서, 어떤 툴을 어떻게 배치할지에 대한 방법은 너무나도 다양하다.
컨트롤 플레인의 모든 요소를 일반 바이너리로 실행해서 systemd에 등록하는 것도 가능한 한편,
컨테이너 이미지 레지스트리를 컨테이너로 띄워도 된다.
일일히 설명하기 구차한 관계로 무조건 방법이 고정돼있는 것을 제외해서는 부연하지 않는다.

구성도를 간단히 하고자 단일 노드로 구성한 클러스터를 가정해보면,

하나의 노드가 클러스터로 동작하기 위해 필수적으로 필요한 것은 크게 두 가지로 구분지을 수 있다.

폐쇄망에서는 두 종류의 파일들을 서빙할 수 있는 별도의 레지스트리, 레포지토리를 구성해야 한다.

리눅스 패키지

클러스터에 컨테이너가 돌아가기 위해 컨테이너를 실행해야 하는 바이너리가 여기에 해당한다.
다음의 것들은 컨테이너로 띄울 수 없어 패키지 형태로 받아서 사용한다.

노드 내부에 자체적으로 만든 미러 레포에서 패키지를 가져오도록 /etc/yum.repos.d와 같은 저장소 설정을 추가해줘야 한다.

컨테이너 이미지

컨테이너 런타임과 kubelet을 제외하면 다른 모든 것들은 컨테이너로 구동시켜 운용이 가능하다.
물론 이것들도 일반적인 실행 가능한 바이너리로 가져와서 구동하는 것도 가능하나, 필수적이진 않다.
(참고로 kubespray를 통해 클러스터를 구축한다면 etcd는 바이너리로 배치된다.)
조금 더 분류하자면,

이들은 전부 tar 형태로 내부로 가져가 압축을 해제하며 컨테이너 이미지 형태로 로드해야 한다.
그리고 내부 레지스트리로 올려주면 된다.
참고로 이 두 작업은 컨테이너 런타임 구축이 선행되어야 한다.

이후 노드 컨테이너 런타임 설정에 미러 설정으로 미러 레지스트리 주소를 넣어주면, 이후 이미지를 풀 받는 일이 있을 때 자동으로 해당 레지스트리로부터 풀 받는다.
(워크로드 양식에 직접 미러 주소를 넣어도 되지만 일일히 이런 작업을 하는 것은 엄청난 비효율이다.)

저장소

인터넷에 연결될 수 있는 환경이라면 이것들은 공인 저장소를 통해 가져올 수 있으나, 폐쇄망에서는 이 모든 것들을 직접 파일로 집어 넣어주어야 한다.
이때 집어넣은 파일들을 편하게 배치하고 구동시키기 위해서 이미지 레지스트리, 패키지 레포지토리가 각각 요구된다.
엄밀하게 이러한 저장소는 필수가 아니지만 버전이나 의존성 등을 효과적으로 관리하고 구축 작업을 자동화하기 위해서는 거의 불가피한 선택이다.

망 내의 모든 노드가 접근할 수 있도록 내부에서 공개된 엔드포인트를 가지고 있는 편이 좋다.

리눅스 패키지의 경우 데비안 계열, 레드햇 계열 배포판에 따라 패키지 관리 툴이 다르다.
레드햇 계열(RHEL, Rocky, CentOS, AlmaLinux...)의 경우 기본 패키지 도구로 rpm이나 의존성 관리까지 가능한 yum, dnf를 사용한다.

번외 - 패키지 전달 전략 정리

리눅스(레드헷 기준) 패키지를 전달하는 방법은 다음의 방법들이 있으며, 아래로 갈수록 더 자동화되고 의존성과 버전 관리에 유리하다.

폐쇄망 클러스터 구축 툴 정리

폐쇄망에서 활용할 수 있는 다양한 툴의 종류를 정리한다.
각 툴에 따라 폐쇄망에 가져가야 할 추가적인 패키지가 필요하다.

아직 실습해보지 못한 다른 툴들은 조금 더 조사가 필요하다.

폐쇄망 클러스터 구축 시나리오

이 부분은 폐쇄망 클러스터를 구축하는 간단한 시나리오를 생각해본 부분이다.

내부망에 아티팩트 스토어를 운영할 때 하버, 넥서스 등은 이미 클라이언트 인증과 이미지 취약점 스캔 등의 기능을 제공하고 있기에 외부와 접촉이 가능하더라도 기본적인 폐쇄망에서 기대되는 보안 수준을 만족할 수 있다.
이 경우 파일을 업데이트하거나 추가하는 운영자는 해당 경로를 통해 빠르게 폐쇄망으로 필요한 데이터들을 전송할 수 있다.

하지만 이러한 환경조차 허용하지 않는 엄격한 보안 요구가 있다면, 다음의 방법을 고려해볼 수 있다.
image.png
인터넷이 연결된 환경에 내부망에서 사용할 모든 데이터를 담은 저장소를 구축하고, 해당 저장소를 내부 저장소가 미러링하게 한다.[19]
하버 등의 저장소는 이러한 자동화된 복제 기능[20]을 제공하고 있기에 만약 두 저장소가 네트워크로 연결될 수 있다면 이 작업은 수월하게 이뤄질 수 있다.
물론 네트워크 연결이 되지 않는 환경이라면 데이터를 이동시키는 것은 usb를 든 사람이 될 것이다.

참고

데비안 계열
https://wimoney.tistory.com/entry/Kubernetes-쿠버네티스-설치Offline-기본-세팅#Podman_설치

바닐라 쿠버 설치 가이드로 잘 돼있긴 한데, 그닥 유용하진 않다.
https://drive.google.com/file/d/1P39WgYQGobx4LizjVLz9AY9F4pb2uyfe/view


  1. https://somaz.tistory.com/416 ↩︎

  2. https://github.com/containers/crun ↩︎

  3. https://medium.com/@taleghani/runc-vs-crun-in-containers-world-62b8143fd9d3 ↩︎

  4. https://gvisor.dev/docs/ ↩︎

  5. https://tech.kakao.com/posts/394 ↩︎

  6. https://kubernetes.io/docs/setup/production-environment/container-runtimes/#cgroupfs-cgroup-driver ↩︎

  7. https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#synopsis ↩︎

  8. https://github.com/containernetworking/plugins?tab=readme-ov-file ↩︎

  9. https://wldnjd2.tistory.com/52 ↩︎

  10. https://kimjayhyun.github.io/posts/yum-offline-install/ ↩︎

  11. https://insoobaik.tistory.com/69 ↩︎

  12. https://wldnjd2.tistory.com/53 ↩︎

  13. https://november11tech.tistory.com/118 ↩︎

  14. https://github.com/rpm-software-management/modulemd-tools ↩︎

  15. https://github.com/kelseyhightower/kubernetes-the-hard-way ↩︎

  16. https://hokka1179.tistory.com/22 ↩︎

  17. https://kurl.sh/ ↩︎

  18. https://kubesphere.io/docs/v3.3/installing-on-kubernetes/on-prem-kubernetes/install-ks-on-linux-airgapped/ ↩︎

  19. https://www.youtube.com/watch?v=Ua0VIJn12sk&t=922s ↩︎

  20. https://goharbor.io/docs/1.10/administration/configuring-replication/create-replication-endpoints/ ↩︎